<?php

namespace app\bll;

use support\Db;

/**
 * 事件方法
 */
class ComponentEventMethod
{

    /**
     * 根据ID 查找单个事件信息
     *
     *
     * @param int $id 事件的唯一标识 ID
     * @return array 包含事件信息的关联数组，如果未找到则返回空数组
     */
    public function find(int $id): array
    {
        // 从 'frame_component_event' 表中查询指定 ID 的第一条记录
        $data = Db::table('frame_component_event_method')
            ->where('id', '=', $id)
            ->first();
        // 如果查询结果为 null，返回空数组；否则将对象转换为关联数组并返回
        return $data === null ? [] : get_object_vars($data);
    }


    /**
     * 根据路径查找事件方法信息
     *
     * @param string $path 路径
     * @param integer $eventid 事件ID
     * @return array
     */
    public function findByPath(string $path, int $eventid): array
    {
        $data = Db::table('frame_component_event_method')
            ->where('path', '=', $path)
            ->where('eventid', '=', $eventid)
            ->first();
        return $data === null ? [] : get_object_vars($data);
    }

    /**
     * 根据方法ID获取方法信息及其所属事件信息
     *
     * @param int $id 事件的唯一标识 ID
     * @return array 包含事件信息和所属组信息的数组，键分别为 'event' 和 'eventgroup'
     */
    public function findInfoAndEventById(int $id): array
    {
        // 调用当前类的 find 方法，根据事件 ID 获取事件的详细信息
        $eventmethodinfo = $this->find($id);
        // 创建 ComponentEventGroup 类的实例，用于查找事件所属组的信息
        $bllComponentEvent = new ComponentEvent();
        // 从事件信息中提取组 ID，并调用 ComponentEventGroup 实例的 find 方法获取组的详细信息
        $eventinfo = $bllComponentEvent->find($eventmethodinfo['eventid']);
        // 返回包含事件信息和所属组信息的数组
        return [
            'eventinfo'       => $eventinfo,
            'eventmethodinfo' => $eventmethodinfo
        ];
    }

    /**
     * 查找事件
     *
     * @param integer $eventid
     * @return array
     */
    public function select(int $eventid): array
    {
        return  Db::table('frame_component_event_method')
            ->where('eventid', '=', $eventid)
            ->get()
            ->map(function ($value) {
                return (array)$value;
            })
            ->toArray();
    }


    /**
     * 事件挂载到hooke
     *
     * @param integer $id
     * @param integer $groupid
     * @param string $hook
     * @return void
     */
    public function mount(int $id, int $groupid, string $hook)
    {


        return  Db::table('frame_component_event_list')
            ->where('eventid', '=', $groupid)
            ->where('id', '=', $id)
            ->update([
                'hook' => $hook
            ]);
    }
}
